package com.ruoyi.pos.domain.system;

import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * POS系统参数配置实体类
 * 
 * 用于管理POS系统的各类配置参数，支持动态配置更新
 * 包括系统配置、设备配置、支付配置、打印配置等
 * 
 * @author POS System
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PosSystemConfig extends BaseEntity {
    
    private static final long serialVersionUID = 1L;

    /**
     * 配置ID（主键）
     */
    private Long configId;

    /**
     * 配置键
     */
    @Excel(name = "配置键")
    @NotBlank(message = "配置键不能为空")
    @Size(max = 100, message = "配置键长度不能超过100个字符")
    private String configKey;

    /**
     * 配置名称
     */
    @Excel(name = "配置名称")
    @NotBlank(message = "配置名称不能为空")
    @Size(max = 100, message = "配置名称长度不能超过100个字符")
    private String configName;

    /**
     * 配置值
     */
    @Excel(name = "配置值")
    private String configValue;

    /**
     * 配置类型
     */
    @Excel(name = "配置类型", readConverterExp = "STRING=字符串,NUMBER=数字,BOOLEAN=布尔,JSON=JSON对象")
    @NotBlank(message = "配置类型不能为空")
    private String configType;

    /**
     * 配置分类
     */
    @Excel(name = "配置分类", readConverterExp = "SYSTEM=系统配置,DEVICE=设备配置,PAYMENT=支付配置,PRINT=打印配置")
    @NotBlank(message = "配置分类不能为空")
    private String category;

    /**
     * 配置描述
     */
    @Excel(name = "描述")
    @Size(max = 500, message = "配置描述长度不能超过500个字符")
    private String description;

    /**
     * 是否加密存储
     */
    @Excel(name = "是否加密", readConverterExp = "false=否,true=是")
    private Boolean isEncrypted;

    /**
     * 是否系统配置
     */
    @Excel(name = "是否系统配置", readConverterExp = "false=否,true=是")
    private Boolean isSystem;

    /**
     * 排序号
     */
    @Excel(name = "排序号")
    private Integer sortOrder;

    /**
     * 状态
     */
    @Excel(name = "状态", readConverterExp = "0=停用,1=正常")
    private String status;

    // ==================== 业务方法 ====================

    /**
     * 获取配置类型显示名称
     */
    public String getConfigTypeDisplay() {
        if (configType == null) {
            return "未知";
        }
        switch (configType) {
            case "STRING":
                return "字符串";
            case "NUMBER":
                return "数字";
            case "BOOLEAN":
                return "布尔";
            case "JSON":
                return "JSON对象";
            default:
                return "未知类型";
        }
    }

    /**
     * 获取配置分类显示名称
     */
    public String getCategoryDisplay() {
        if (category == null) {
            return "未知";
        }
        switch (category) {
            case "SYSTEM":
                return "系统配置";
            case "DEVICE":
                return "设备配置";
            case "PAYMENT":
                return "支付配置";
            case "PRINT":
                return "打印配置";
            default:
                return "未知分类";
        }
    }

    /**
     * 获取状态显示名称
     */
    public String getStatusDisplay() {
        if (status == null) {
            return "未知";
        }
        switch (status) {
            case "0":
                return "停用";
            case "1":
                return "正常";
            default:
                return "未知状态";
        }
    }

    /**
     * 判断是否为正常状态
     */
    public boolean isNormal() {
        return "1".equals(status);
    }

    /**
     * 判断是否为系统配置
     */
    public boolean isSystemConfig() {
        return isSystem != null && isSystem;
    }

    /**
     * 判断是否为加密配置
     */
    public boolean isEncryptedConfig() {
        return isEncrypted != null && isEncrypted;
    }

    /**
     * 获取布尔值
     */
    public Boolean getBooleanValue() {
        if ("BOOLEAN".equals(configType) && configValue != null) {
            return Boolean.parseBoolean(configValue);
        }
        return null;
    }

    /**
     * 获取整数值
     */
    public Integer getIntegerValue() {
        if ("NUMBER".equals(configType) && configValue != null) {
            try {
                return Integer.parseInt(configValue);
            } catch (NumberFormatException e) {
                return null;
            }
        }
        return null;
    }

    /**
     * 获取长整数值
     */
    public Long getLongValue() {
        if ("NUMBER".equals(configType) && configValue != null) {
            try {
                return Long.parseLong(configValue);
            } catch (NumberFormatException e) {
                return null;
            }
        }
        return null;
    }

    /**
     * 获取字符串值
     */
    public String getStringValue() {
        return configValue;
    }

    // ==================== 备用扩展字段 ====================
    
    /**
     * 备用字段1
     */
    private String reserved1;

    /**
     * 备用字段2
     */
    private String reserved2;

    /**
     * 备用字段3
     */
    private String reserved3;

    /**
     * 备用字段4
     */
    private String reserved4;

    /**
     * 备用字段5
     */
    private String reserved5;
}

